今天來學習如何在Docker內使用MongoDB,以及Docker secrets。
要使用Docker建立MongoDB首先要取得映像檔,直接去Docker hub查看映像檔的版本,因為只是要學習直接用latest版本
docker pull mongo
取得映像檔之後就可以開始建置,但是在此之前先建立一個儲存資料的地方,因此先建立一個資料夾。
mkdir mongodb
接下來就能建置mongoDB(mongodb預設的port為27017),如果不需要公開可以將-p 27017:27017
移除
docker run -it -v mongodb:/data/db -p 27017:27017 --name mongodb -d mongo
建立好之後可以使用logs查看container的log,有新刪修也會顯示在上面
docker logs mongodb
建立好mongodb後我們可以使用exec連接到container以使用mongodb的指令
$ docker exec -it mongodb bash
root@<container ID>:/#
既然學到了MongoDB就一起來學Docker secrets,當我們在Docker swarm建立MongoDB的時候需要配置username跟password,但是總不可能直接將其寫在配置檔中,其他機敏資料還包含SSH私鑰、證書等等,因此Docker有一套存放機敏資料的方法。這些機敏資料存在Docker Swarm處於靜止時會是加密狀態,只有被授權的服務且處於運行中才可以訪問。
加密的文件預設會儲存在/run/secrets/<secret_name>
接下來讓我們來學習如何使用Docker secrets
如官方的範例,我們先用secret
指令建立my_secret_data
docker secret create my_secret_data -
再使用--secret
flag指定要使用的secret檔案
docker service create --name redis --secret my_secret_data redis:alpine
建置好redis也可以透過exec查看使用的secret,顯示就會是你剛剛設定的secret內容
docker container exec $(docker ps --filter name=redis -q) cat /run/secrets/my_secret_data
接下來讓我們實用secret至mongoDB
首先建立mongodb_root_username,並使用vim編輯器輸入username
$ touch mongodb_root_username
$ vim mongodb_root_username
$ docker secret create mongodb_root_username ./mongodb_root_username
再建立mongodb_root_password,並使用vim編輯器輸入password
$ touch mongodb_root_password
$ vim mongodb_root_password
$ docker secret create mongodb_root_password ./mongodb_root_password
建立好之後可以使用ls查看所有的secret設置
$ docker secret ls
ID NAME DRIVER CREATED UPDATED
0r8bsldt0uh0tf5lczgh6k8ky mongodb_root_password About a minute ago About a minute ago
ufbpe94tzxpixpm6fhhdd9ctm mongodb_root_username About a minute ago About a minute ago
最後配置好swarm YAML檔,就可以使用拉。
version: "3.8"
services:
mongodb:
build: ./mongodb
ports:
- 27017:27017
environment:
MONGO_INITDB_ROOT_PASSWORD_FILE: /run/secrets/mongodb_root_password
MONGO_INITDB_ROOT_USERNAME_FILE: /run/secrets/mongodb_root_username
MONGO_INITDB_DATABASE: database01
MONGO_DATABASE: todolist
secrets:
- mongodb_root_password
- mongodb_root_username
secrets:
mongodb_root_password:
external: true
mongodb_root_username:
external: true
參考文獻:
Manage sensitive data with Docker secrets
Docker hub MongoDB